# 数据容器 相当于Java中的集合
# 四大数据容器
# 列表list、元组tuple、字典dict、集合set

# 列表list
# 特点：
# 1、list中的每个元素的类型可以不唯一
# 2、list中的元素可以重复
# 3、list是可变的，元素可以修改
# 4、list是有序的
# 定义：
list1 = [1, 1, 1, 2, 3, 4, 'a', 'b', 'c', 'd', 1.1, 1.2, True, False]
print(list1, type(list1))

# list常见操作

# 取元素
# 通过下标（索引 index）
print(list1[6])  # 'a'

# 切片
# [起始位置:结束位置:步长]
print(list1[6:10])
print(list1[-4:])
# 反转
print(list1[::-1])

# 修改元素
# 'a' => 'A'
list1[6] = 'A'
print(list1)

# 增加元素
list1.append('last')
list1.insert(3, 1.1)
print(list1)

# 删除元素
list1.pop()  # 默认将最后一个元素返回
list1.remove(1.1)  # 根据指定的值 移除元素 只会移除一次
print(list1)
del list1[5]
print(list1)

# 其他操作
# 排序
list2 = [1, 5, 4, 2, 10, 3, 7, 6, 9, 8]
list2.sort(reverse=True)
print(list2)

# 查找元素
print(list2.index(7))

# 合并两个list
list3 = [1, 2, 3, 4]
print(list2 + list3)  # + 不会改变原有的list
list2.extend(list3)  # 会对list2造成修改
print(list2)

# 反转
list2.reverse()
print(list2)

# 统计元素出现的次数
print(list2.count(1))

# 清空列表
list2.clear()
print(list2)

print("*" * 30)

# tuple元组 (不可变)
# 特点：
# 1、tuple中的每个元素的类型可以不唯一
# 2、tuple中的元素可以重复
# 3、tuple是不可变的
# 4、tuple是有序的
# 定义：
tuple1 = (1, 1, 1, 2, 2, 3, 4, 5, 6, 'a', 'b', 'c', 1.1, True)
print(tuple1, type(tuple1))

# 元组不支持修改
# tuple1[9] = 'A'

# 取元素
print(tuple1[9])

print("*" * 30)

# 集合set （元素不可以重复）
# 特点：
# 1、set中的每个元素的类型可以不唯一
# 2、set中的元素不可以重复 会自动去重
# 3、set是可变的
# 4、set是没有顺序的
# 定义
set1 = {1, 1, 1, 2, 2, 2, 3, 4, 5, "abc", True}
print(set1, type(set1))

# print(set1[0]) # 无序 无法通过索引的方式取元素
set1.pop()
print(set1)

set1.add(2)
set1.add(2)
set1.add(3)
set1.add(6)
print(set1)

# 集合的运算
# 交集 并集 差集 ......
set2 = {1, 2, 3, 4, 5, 6}
set3 = {4, 5, 6, 7, 8, 9}
print(set2 & set3)
print(set2 | set3)
print(set2 - set3)

# 字典 dict 相当于Java中Map
# 特点:
# 1、dict中的每一个元素都是k:v格式的
# 2、dict不支持使用index获取元素，都是通过key取value
# 3、dict是可变的
# 4、dict的key不能重复，是唯一的，key必须是不可变的(基本数据类型、tuple)
# 5、如果key中 1 和 True 以及 0 和 False 同时存在 会进行覆盖
# 6、查询速度不会随着元素的增多而变慢
# 7、dict中value的类型可以是任意的
# 定义
dict1 = {
    'k1': 'v1',
    'k2': 'v2',
    'k2': 'vv2',
    0: '0',
    1: '1',
    2: '2',
    (1, 2, 3): 'tuple 1,2,3',
    # [4,5,6]:'list 4,5,6'
    True: 'True',
    False: 'False',
    # {'k1':'v1'}:'dict v'
    'kk2': 1,
    'kk3': 1.1,
    'kk4': [1, 2, 3],
    'kk5': {
        'kkk5': {
            'kkkk5': 'vvvv5'
        }
    }

}
print(dict1, type(dict1))

# print(dict1[0]) # 不支持通过下标取元素
# 通过key取value
print(dict1['k1'])
dict1['k1'] = 'vv1'
print(dict1)
# 推荐使用get获取元素
print(dict1.get('k1'))
print(dict1['k1'])
# print(dict1['kk1'])
print(dict1.get('kk1', '如果key不存在就返回'))
print(dict1.get('kk5').get('kkk5').get('kkkk5'))

# 常见的操作
print(dict1.keys())
print(dict1.values())
print(dict1.items())

# 遍历数据容器
# for 变量名 in 数据容器
list1 = [1, 2, 3, 4, 5]
for i in list1:
    # 前面必须有4个空格（语法）
    print(i)
# 定义只有一个元素的元组时要加上,
tuple1 = (1,)
print(tuple1, type(tuple1))

tuple2 = (1, 2, 3, 4, 5)
for i in tuple2:
    print(i)

set1 = {1, 1, 1, 2, 3, 4, 5, 5, 6}
for i in set1:
    print(i)  # 打印去重后的结果

dict1 = {
    'k1': 'v1',
    'k2': 'v2',
    'k3': 'v3'
}

# 对key进行遍历
for key in dict1:
    print(key, dict1.get(key))

for kv in dict1.items():
    print(kv[0], kv[1])

for k, v in dict1.items():
    print(k, v)

# 创建一个 1~10的list
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list1)

# 创建一个 1~100的所有的奇数list
# range(起始位置:结束位置:步长)函数
list100 = []
for i in range(1, 101, 1):
    list100.append(i)
print(list100)

# 列表推导式
print([i for i in range(1, 101, 1)])

# join 方法 与 split方法相反
str1 = 'java,scala,python'
list3 = str1.split(",")
print(list3, type(list3))
str2 = "\t".join(list3)
print(str2, type(str2))

# 9 * 9 乘法表
# print("\n".join(["\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))

for i in range(1, 10):
    list1 = []
    for j in range(1, i + 1):
        list1.append("{} * {} = {}".format(i, j, i * j))
    print("\t".join(list1))

list_i = []
for i in range(1, 10):
    # print("\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]))
    list_i.append("\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]))
print("\n".join(list_i))

print("\n".join(["\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))